package es.gesfutbol.web;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.hibernate.criterion.Order;
import org.springframework.ui.ModelMap;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import es.gesfutbol.dao.IEquipEnLligaDao;
import es.gesfutbol.dao.IJornadaDao;
import es.gesfutbol.dao.ILligaDao;
import es.gesfutbol.domini.implementacio.EquipEnLliga;
import es.gesfutbol.domini.implementacio.Jornada;
import es.gesfutbol.domini.implementacio.Lliga;
import es.gesfutbol.util.OrdenaEquipsEnLligaPerPuntuacio;
import es.gesfutbol.util.OrdenaJornadesPerNumero;

public class ResultatsController extends MultiActionController{
	
	private ILligaDao lligaDao; 
	private IJornadaDao jornadaDao;
	private IEquipEnLligaDao equipEnLligaDao;
	
	public ILligaDao getLligaDao(){
		return lligaDao;
	}
	
	public void setLligaDao(ILligaDao lligaDao){
		this.lligaDao = lligaDao;
	}
	
	public IJornadaDao getJornadaDao() {
		return jornadaDao;
	}

	public void setJornadaDao(IJornadaDao jornadaDao) {
		this.jornadaDao = jornadaDao;
	}
	
	public IEquipEnLligaDao getEquipEnLligaDao() {
		return equipEnLligaDao;
	}

	public void setEquipEnLligaDao(IEquipEnLligaDao equipEnLligaDao) {
		this.equipEnLligaDao = equipEnLligaDao;
	}
	
	public ModelAndView showResultats(HttpServletRequest request,
			HttpServletResponse response)throws Exception{
		
		String temporada = request.getParameter("temporada");
		String nom = request.getParameter("nom");
		
		Lliga lliga = lligaDao.findLligaPerNomITemporada(nom, temporada);
		lliga = lligaDao.deproxy(lliga);
		
		Set<Jornada> jornadesLliga = lliga.getJornades();
		List<Jornada> jornades = new ArrayList<Jornada>();
		Iterator<Jornada> it = jornadesLliga.iterator();
		while(it.hasNext()){
			jornades.add(jornadaDao.deproxy(it.next()));
		}
		
		Collections.sort(jornades, new OrdenaJornadesPerNumero());
		
		ModelMap model = new ModelMap();
		model.put("lliga", lliga);		
		model.put("llistatJornades", jornades);		
		return new ModelAndView("gesfutbol/resultats", model);
	}
	
	public ModelAndView showHistorics(HttpServletRequest request,
			HttpServletResponse response)throws Exception{
		
		List<Lliga> lligues = lligaDao.findAll( Order.desc("temporada") );
		ModelMap model = new ModelMap();
		model.put("llistatLligues", lligues);
		return new ModelAndView("gesfutbol/resultats_historics", model);
	}
	
	public ModelAndView viewHistorics(HttpServletRequest request,
			HttpServletResponse response)throws Exception{
		
		Lliga lliga = lligaDao.findById(Long.valueOf(request.getParameter("idLliga")));

		return new ModelAndView("redirect:showResultats.htm?temporada=" + lliga.getTemporada() + "&nom=" + lliga.getNom());
	}
	
	public ModelAndView showClassificacio(HttpServletRequest request,
			HttpServletResponse response)throws Exception{
		
		String temporada = request.getParameter("temporada");
		String nom = request.getParameter("nom");
		
		Lliga lliga = lligaDao.findLligaPerNomITemporada(nom, temporada);
		
		List<EquipEnLliga> equipsEnLliga = equipEnLligaDao.findByIdLligaDeproxy(lliga.getIdLliga());
		
		Collections.sort(equipsEnLliga, new OrdenaEquipsEnLligaPerPuntuacio());
		
		ModelMap model = new ModelMap();
		model.put("lliga", lliga);		
		model.put("llistatEquipsEnLliga", equipsEnLliga);
		return new ModelAndView("gesfutbol/classificacio", model);
	}

}
